package jmine.tec.web.wicket.component.buildinfo;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.wicket.markup.html.basic.Label;

/**
 * Cria o compomente de buildInfo.
 * 
 * @author piercio
 */
public class BuildInfo {

    private static final Logger LOG = LogManager.getLogger(BuildInfo.class);

    private static final String SNAPSHOT = "SNAPSHOT";

    private String filename;

    private String buildInfo;

    /**
     * Devolve a versão do build.
     * 
     * @param id o id do componente.
     * @return um {@link Label} com a versão do componente.
     */
    public Label getInfoLabel(String id) {
        return new Label(id, this.getBuildInfo());
    }

    /**
     * @return a versão do sistema de acordo com o arquivo de build-info passado.
     */
    private String getBuildInfo() {
        if (this.buildInfo != null) {
            return this.buildInfo;
        }

        if (this.filename == null) {
            LOG.debug("Não informado nome do arquivo!");
            return "";
        }
        InputStream in = this.getClass().getClassLoader().getResourceAsStream(this.filename);
        if (in == null) {
            LOG.warn("Arquivo '" + this.filename + "' não encontrado no classpath!");
            return "";
        }
        Properties prop = new Properties();
        try {
            prop.load(in);
            in.close();
        } catch (IOException e) {
            LOG.warn("Erro durante a leitura do arquivo '" + this.filename + "': " + e.getMessage());
            return "";
        }

        this.buildInfo = prop.getProperty("version");
        if (this.buildInfo == null) {
            LOG.warn("Propriedade 'version' não encontrada no arquivo '" + this.filename + "'");
            return "";
        }

        if (this.buildInfo.contains(SNAPSHOT)) {
            this.buildInfo = this.buildInfo + " " + prop.getProperty("timestamp");
        }
        this.buildInfo = this.buildInfo + " | Revision: " + prop.getProperty("revision");

        return this.buildInfo;
    }

    /**
     * @param filename the filename to set
     */
    public void setFilename(String filename) {
        this.filename = filename;
    }

}
